package Sort;

/**
 * 排序算法类的模板2
 * 为了方便测试，具体排序类继承此类即可
 * <p>
 * 方法简介：
 * sort(Comparable[] a) 排序传入的数组
 * less(Comparable v,Comparable w) 比较v,w的值，若v<w 返回boolean类型
 * exch(Comparable[] a,int i,int j) 交换数组a中下标为i，j两者的值
 * show(Comparable[] a) 控制台输出此数组
 * isSorted(Comparable[] a) 判断数组是否已经排序完成 返回boolean类型
 */
public abstract class Template {

    /**
     * 抽象方法
     * 排序
     * 参数 Comparable[] 类型
     */
    public static void sort(Comparable[] a) {
    }

    /**
     * 比较v,w的值，若v<w 返回true，否则返回false
     *
     * @param v
     * @param w
     * @return
     */
    public static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) <= 0;
    }

    /**
     * 交换数组a中下标为i，j两者的值
     *
     * @param a
     * @param i
     * @param j
     */
    public static void exch(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    /**
     * 输出此数组
     *
     * @param a
     */
    public static void show(Comparable[] a) {
        //单行打印数组
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();//换行
    }

    public static void show(int[] a) {
        //单行打印数组
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();//换行
    }

    /**
     * 判断数组是否已经排序完成
     *
     * @param a
     * @return
     */
    public static boolean isSorted(Comparable[] a) {
        //用于测试数组是否排序
        for (int i = 1; i < a.length; i++) {
            if (less(a[i], a[i - 1])) {
                return false;
            }
        }
        return true;
    }

    //判断整形数据是否排序好
    public static boolean isSorted(int[] a) {
        //用于测试数组是否排序
        for (int i = 1; i < a.length; i++) {
            if (less(a[i], a[i - 1])) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取一个用于测试的随机数组
     * 参数；int testSize 测试数组的大小
     *
     * @return
     */
    public static Comparable[] getData(int testSize) {
        Comparable[] a = new Comparable[testSize];
        for (int i = 0; i < testSize; i++) {
            a[i] = (int) (Math.random() * testSize * 10);//生成一个[0,testSize]随机数组
        }
        return a;
    }


    //整形数据
    public static int[] getIntData(int testSize) {
        int[] a = new int[testSize];
        for (int i = 0; i < testSize; i++)
            a[i] = (int) (Math.random() * testSize);
        return a;
    }
}
